package Servlets;

import DAOS.sistema.SistemaDAO;
import DAOS.sistema.UsuariosDAO;
import DTOS.sistema.ConfiguracionDTO;
import DTOS.sistema.GeneralesUsuarioDTO;
import DTOS.sistema.SistemaDTO;
import DTOS.sistema.UsuarioSistemaDTO;
import Herramientas.Herramientas;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author AlanGR
 */
@WebServlet(name = "UsuariosAcceso", urlPatterns = {"/UsuariosAcceso"})
public class UsuariosAcceso extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String funcion = request.getParameter("funcion");
        HttpSession session = request.getSession();

        try {
            switch (funcion) {
                case "principal":
                    
                    Herramientas herramientas = new Herramientas();
                    
                    System.out.println("----------");
                    System.out.println("marisol");
                    System.out.println(herramientas.encriptaMD5("marisol"));
                    System.out.println("----------");
                    
                    this.principal(request, response, session);
                    break;
                case "noLogin":
                    this.noLogin(request, response, session);
                    break;
                case "administradorUsuarios":
                    this.adminUsers(request, response, session);
                    break;
                case "editarUsuario":
                    this.editarUsuario(request, response, session);
                    break;
                case "nuevoUsuario":
                    this.nuevoUsuario(request, response, session);
                    break;
                case "resumenUsuario":
                    // this.resumenUsuarioJasper(request, response, session);
                    break;
                case "cierraSesion":
                     this.logOut(request, response, session);
                    break;

                default:
                    out.println("<center>error no hay funcion para el desencadenador: <b>" + funcion + "</b> </center>");
                    break;
            }
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="FUNCIONES DOPOST DO GET">
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * ALAN GONZALEZ FUNCION PRINCIPAL PARA EL LOGUEO DE ALTA SEGURIDAD DEL
     * USUARIO
     *
     * @param request
     * @param response
     * @param session
     */
    public void principal(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        SistemaDAO sistemaDAO = new SistemaDAO();
        UsuariosDAO usuariosDAO = new UsuariosDAO();
        UsuarioSistemaDTO usuarioLogin = new UsuarioSistemaDTO();
        UsuarioSistemaDTO usuarioExiste = new UsuarioSistemaDTO();
        GeneralesUsuarioDTO generalesUsuarioDTO = new GeneralesUsuarioDTO();
        ConfiguracionDTO config = new ConfiguracionDTO();

        Herramientas tools = new Herramientas();

        String usuario = request.getParameter("usuario");
        String password = request.getParameter("password");
        String encriptedPass = tools.encriptaMD5(password);

        usuarioLogin.setUsuarioNombre(usuario);
        usuarioLogin.setClaveUsuario(tools.encriptaMD5(password));

        SistemaDTO sistema = new SistemaDTO();
        usuarioExiste = usuariosDAO.usuarioSistema(usuarioLogin);

        RequestDispatcher d = null; //request.getRequestDispatcher("");

        // -----
        Herramientas herramientas = new Herramientas();

        // -----
        if (usuarioExiste != null) {
            System.out.println("login correcto");
            //generalesUsuarioDTO = usuariosDAO.generalesUsuarioDTO(usuarioExiste.getId());
            usuarioExiste.setGeneralesUsuario(generalesUsuarioDTO);
            config = sistemaDAO.configuracionSistema();

            sistema.setConfigSistema(config);   // configuracion del sistema
            sistema.setUsuario(usuarioExiste);  // configuracion del usuario
            sistema.setMenu(sistemaDAO.estructuraMenuUsuario(usuarioExiste.getId()));              // estructura del menu dinamico

            session.setAttribute("sistema", sistema);
            d = request.getRequestDispatcher(usuarioExiste.getFuncionInicio().toString());
        } else {
            Vector errores = new Vector();
            errores.add("Nombre de Usuario y/o Contraseña NO son Validos favor de verificar");
            sistema.setErrores(errores);
            d = request.getRequestDispatcher("./UsuariosAcceso?funcion=noLogin");
            System.out.println("login incorrecto");
        }
        try {
            d.forward(request, response);
        } catch (ServletException | IOException ex) {
            Logger.getLogger(UsuariosAcceso.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
   

    /**
     * ALAN GONZALEZ REDIRECCION A INDEX POR USUARIO INCORRECTO
     *
     * @param request
     * @param response
     * @param session
     */
    public void noLogin(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        SistemaDTO sistema = (SistemaDTO) session.getAttribute("sistema");
        RequestDispatcher d = request.getRequestDispatcher("./index.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException | IOException ex) {
            Logger.getLogger(UsuariosAcceso.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ EL ADMINISTRADOR DE USUARIOS
     *
     * @param request
     * @param response
     * @param session
     */
    public void adminUsers(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        SistemaDTO sistema = (SistemaDTO) session.getAttribute("sistema");
        session.setAttribute("tituloVista", "Administrador de Usuarios");
        UsuariosDAO usuariosDAO = new UsuariosDAO();
        Vector usuarios = new Vector();
        usuarios = usuariosDAO.usuarios();
        session.setAttribute("usuariosSistemaSession", usuarios);

        RequestDispatcher d = request.getRequestDispatcher("./sistema/administradorUsuarios.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException | IOException ex) {
            Logger.getLogger(UsuariosAcceso.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ EL ADMINISTRADOR DE USUARIOS
     *
     * @param request
     * @param response
     * @param session
     */
    public void editarUsuario(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int control = Integer.parseInt(request.getParameter("index"));
        switch (control) {
            case 1: // se carga el usuario y se muestrea la informacio
                SistemaDTO sistema = (SistemaDTO) session.getAttribute("sistema");
                int usuarioID = Integer.parseInt(request.getParameter("usuarioID"));
                UsuariosDAO usuariosDAO = new UsuariosDAO();
                UsuarioSistemaDTO us = new UsuarioSistemaDTO();
                us = usuariosDAO.usuariosXID(usuarioID);
                session.setAttribute("usuarioSistemaSession", us);
                session.setAttribute("tituloVista", "Editando Usuario");
                RequestDispatcher d = request.getRequestDispatcher("./sistema/usuarioInterfaz.jsp");
                try {
                    d.forward(request, response);
                } catch (ServletException | IOException ex) {
                    Logger.getLogger(UsuariosAcceso.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 2:
                // RECUPERANDO LOS DATOS VALIDANDOLOadS  REALIZANDO UPDATE REDIRECCIONANDO 
                break;
        }

    }

    /**
     * ALAN GONZALEZ NUEVO USUARIO DEL SISTEMA
     *
     * @param request
     * @param response
     * @param session
     * @throws IOException
     * @throws ServletException
     */
    public void nuevoUsuario(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException, ServletException {

        int index = Integer.parseInt(request.getParameter("index"));
        RequestDispatcher redireccion = null; //request.getRequestDispatcher("./sistema/usuarioInterfaz.jsp");

        SistemaDAO sistemaDAO = new SistemaDAO();
        switch (index) {
            case 1: // SE MUESTAR LA 
                session.setAttribute("tituloVista", "Nuevo Usuario");
                redireccion = request.getRequestDispatcher("./sistema/usuarioInterfaz.jsp");
                break;
            case 2:
                // SE RECUPERAN LOS DATOS DE USUARIO Y LOGUIN Y ADICIONALMENTE SE VALIDA DE SI YA EXISTEN
                String nombreUsuario = request.getParameter("usuario");
                String clave = request.getParameter("password");
                // VALIDACIONES
                // SUBIDA DE DATOS VALIDADOS A SESSION
                break;
            case 3:
                // SE DESCARGAN LOS DATOS DE LA SESSION VALIDADOS 
                // SE MUESTRA EL FORMULARIO DE REGISTRO DE GENERALES DEL USUARIO
                // SE VALIDAN LOS DATOS INGRESADOS 
                // SE CARGAN LOS DATOS A LOS DTO 
                redireccion = request.getRequestDispatcher("./sistema/usuarioInterfaz.jsp");
                break;
            case 4:
                // SE RECUPERAN LOS DATOS DE DE LOS GENERALES DEL USUARIO Y SE VALIDAN Y SE HACE EL CONTROL DE ERRORES
                break;
            case 5:
                // SE RECUPERAN LOS DATOS SESIONADOS DEL USUARIO Y LA SELECCION DE MODULOS PARA EL USUARIO
                Vector modulos = sistemaDAO.modulosSistema();
                session.setAttribute("catalogoModulos", modulos);
                // SE GENERAN TODOS LOS REGISTROS 
                // SE ENVIA UNA COPIA DE LOS DATOS PROPORCIONADOS AL EMAIL DEL REGISTRO CON CODIFIGACION RESPOSIVE HTML
                // SE ELIMINAN LOS DATOS DE SESION 
                // SE CIERRA LA SESIO Y SE REDIRECCIONA AL LOGIN 
                break;
            case 6:
                // SE RECUPERAN LOS MODULOS SELECCIONADOS PARA EL USUARIO DEL CATALOGOI
                break;
            case 7:
                // DESCARGA DE LOS DATOS DE SESION PREVIAMENTE VALIDADOS SE REALIZA EL REGISTRO
                // SE ENVIA UNA COPIA DE LOS DATOS INGRESADOS AL EMAIL RESPONSIVE HTML 
                // SE ELIMINAN TODOS LOS OBJETOS EN SESION ACTIVA Y FINALMENTE SE REDIRECCIONA AL LOGIN DEL SISTEMA 
                break;
        }
        try {
            redireccion.forward(request, response);
        } catch (ServletException | IOException ex) {
            Logger.getLogger(UsuariosAcceso.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ CIERRA SESION DEL USUARIO
     * @param request
     * @param response
     * @param session 
     */
    public void logOut(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        session.invalidate();
        RequestDispatcher redireccion = request.getRequestDispatcher("./");
         try {
            redireccion.forward(request, response);
        } catch (ServletException | IOException ex) {
            Logger.getLogger(UsuariosAcceso.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
